package body Generateur_Xml is

	function Creer_Noeud (Nom : String) return Ptr_Noeud is
	begin
		return Creer_Noeud (Nom, "");
	end Creer_Noeud;
	
	function Creer_Noeud (Nom : String; Valeur : String) return Ptr_Noeud is
	begin
		return new Noeud'(To_Unbounded_String(Nom), To_Unbounded_String(Valeur), Frere => Null, Fils => Null, Attribut => Null);
	end Creer_Noeud;

	function Creer_Noeud (Nom : String; Valeur : Integer) return Ptr_Noeud is
	begin
		return Creer_Noeud(Nom, Natural_To_Str(Valeur));
	end Creer_Noeud;
	
	procedure Associer (Pere : in out Ptr_Noeud; Fils : in Ptr_Noeud) is
	begin
		if Pere.Fils = Null then
			Pere.Fils := Fils;
		else
			Fils.Frere := Pere.Fils;
			Pere.Fils := Fils;
		end if;
	end Associer;
	
	procedure Ajouter_Attribut (N : in out Ptr_Noeud; Nom : in String; Valeur : in String) is
		Nouvel_Attribut : Ptr_Attribut;
	begin
		Nouvel_Attribut := new Attribut'(To_Unbounded_String(Nom), To_Unbounded_String(Valeur), Frere => Null);
		if N.Attribut = Null then
			N.Attribut := Nouvel_Attribut;
		else
			Nouvel_Attribut.Frere := N.Attribut;
			N.Attribut := Nouvel_Attribut;
		end if;
	end Ajouter_Attribut;

    procedure Ajouter_Attribut (N : in out Ptr_Noeud; Nom : in String; Valeur : in Character) is
    begin
        Ajouter_Attribut(N, Nom, Valeur & "");
    end Ajouter_Attribut;
    
    procedure Ajouter_Attribut (N : in out Ptr_Noeud; Nom : in String; Valeur : in Integer) is
    begin
        Ajouter_Attribut(N, Nom, Integer'Image(Valeur));
    end Ajouter_Attribut;
    
	function To_Xml (N : Ptr_Noeud) return String is
		Xml : Unbounded_String;
	begin
		Xml := "<" & N.Nom & To_Xml(N.Attribut);
		if (N.Fils = Null) and (N.Valeur = "") then
			Xml := Xml & "/>";
		else
			Xml := Xml & ">";
			if (N.Fils /= Null) then
				Xml := Xml & To_Xml(N.Fils);
			end if;
			
			if (N.Valeur /= "") then
				Xml := Xml & N.Valeur;
			end if;
			
			Xml := Xml & "</" & N.Nom & ">";
		end if;
		
		if N.Frere /= Null then
			Xml := Xml & To_Xml(N.Frere);
		end if;
		
		return To_String(Xml);
	end To_Xml;

	function To_Xml (A : Ptr_Attribut) return Unbounded_String is
	begin
		if A = Null then 
			return To_Unbounded_String("");
		else
			return (" " & A.Nom & "=" & "'" & A.Valeur & "'" & To_Xml(A.Frere));
		end if;
	end To_Xml;

end Generateur_Xml;